package com.zhiwu;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;

import java.sql.Types;
import java.util.Collections;

public class GeneratorCode {
    public static void main(String[] args) {
        // TODO 数据库
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/<数据库>?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai", "<username>", "<password>")
                         .globalConfig(builder -> {
                             // TODO 设置作者
                             builder.author("zhiwu")
                                    .outputDir("src/main/java"); // 指定输出目录
                         })
                         .dataSourceConfig(builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                             int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                             // 将tinyint和smallint都映射为integer
                             if (typeCode == Types.TINYINT || typeCode == Types.SMALLINT) {
                                 // 自定义类型转换
                                 return DbColumnType.INTEGER;
                             }
                             return typeRegistry.getColumnType(metaInfo);
                         }))
                         // TODO 设置父包名 父包名和父包模块名看自己项目设置，以防之后拖动代码时，导入的路径不对
                         .packageConfig(builder -> builder.parent("com.zhiwu") // 设置父包名
                                                          // .moduleName("<父包模块名>") // 设置父包模块名
                                                          .pathInfo(Collections.singletonMap(OutputFile.xml, "src/main/resources/mapper")) // 设置mapperXml生成路径
                         )
                         // TODO 设置需要生成的表名
                         .strategyConfig(builder -> builder.addInclude("<表1>", "<表2>") // 设置需要生成的表名
                                                           // .addTablePrefix("t_", "c_") // 设置过滤表前缀
                                                           .entityBuilder()
                                                           .enableLombok() // 开启lombok模型
                                                           .enableTableFieldAnnotation() // 开启生成实体时生成字段注解
                                                           .addTableFills(new Column("create_time", FieldFill.INSERT), new Column("update_time", FieldFill.INSERT_UPDATE)) // 设置添加字段填充
                                                           .controllerBuilder()
                                                           .enableRestStyle() // 开启生成 @RestController 控制器
                                                           .serviceBuilder()
                                                           .formatServiceFileName("%sService")// 设置Service接口文件名格式（去除I前缀）
                         )
                         .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                         .execute();
    }
}
